#pragma once
#include "HashTable.h"

namespace wyd
{
    template <class K, class V, class GetInt = GetInt<V>>
    class unordered_map
    {
        class MapOfKey
        {
        public:
            const K& operator()(const pair<K, V>& kv)
            {
                return kv.first;
            }
        };
    public:
        typedef typename HashList<K, pair<const K, V>, MapOfKey, GetInt>::iterator iterator;
        iterator begin()
        {
            return _h.begin();
        }
        iterator end()
        {
            return _h.end();
        }
        bool insert(const pair<const K, V>& kv)
        {
            return _h.insert(kv).second;
        }
        iterator find(const pair<const K, V>& kv)
        {
            return _h.find(kv);
        }
        iterator erase(const pair<const K, V>& kv)
        {
            return _h.erase(kv);
        }
        V& operator[](const K& key)
        {
            pair<iterator, bool> ret = _h.insert(pair<const K, V>(key, V()));
            return ret.first->second;
        }
        size_t size()const
        {
            return _h.size();
        }
        bool empty()const
        {
            return _h.empty();
        }
    private:
        HashList<K, pair<const K, V>, MapOfKey, GetInt> _h;
    };
}